使用 Profiling build 测量 Kanzi Engine 不同部分的性能。此构建包括 已剖析的 Kanzi 库。
Profiling build 带有性能剖析类别和剖析程序,您可以用于测量 Kanzi Engine 不同部分的性能:
启动性能剖析程序测量应用程序启动期间 Kanzi Engine 花费在不同任务的时间。启动性能剖析程序在 StartupProfilerRegistry
中注册。默认情况下,所有启动性能剖析类别已启用。要在应用程序配置中设置类别状态,使用 配置名称。请参阅ProfilingCategoryFilter。
此表列出了 Kanzi 启动性能剖析类别和 Profiling build 中包含的剖析程序。
类别 (Category) | 配置名称 | 剖析程序 |
---|---|---|
应用程序初始化 | StartupInitialization | m_initializationProfiler |
默认资源注册 | StartupRegisterDefaultResources | m_registerDefaultResourcesProfiler |
图像初始化 | StartupInitializeGraphics | m_initializeGraphicsProfiler |
GL 子系统初始化 | StartupInitializeGL | m_initializeGLProfiler |
启动 kzb 文件打开 | StartupOpenKzb | m_openKzbProfiler |
加载线程初始化 | StartupInitializeLoadingThreads | m_initializeLoadingThreadsProfiler |
元数据注册 | StartupRegisterMetadata | m_registerMetadataProfiler |
插件加载 | StartupLoadPlugins | m_loadPluginsProfiler |
预设件加载 | StartupLoadPrefab | m_loadPrefabProfiler |
预设件安装 | StartupInstantiatePrefab | m_instantiatePrefabProfiler |
预设件附加 | StartupAttachPrefab | m_attachPrefabProfiler |
渲染器重置 | StartupResetRenderer | m_resetRendererProfiler |
运行时资产注册 | StartupRegisterRuntimeAssets | m_registerRuntimeAssetsProfiler |
主循环任务性能剖析程序测量 Kanzi Engine 在 Kanzi 主循环每次迭代的不同任务花费的时间。主循环任务性能剖析程序在 MainLoopTaskProfilerRegistry
中注册。默认情况下,所有主循环任务性能剖析类别已启用。要在应用程序配置中设置类别状态,使用 配置名称。请参阅ProfilingCategoryFilter。
此表列出了 Kanzi 主循环任务性能剖析类别和 Profiling build 中包含的剖析程序。
类别 (Category) | 配置名称 | HUD 中的标题 | 剖析程序 |
---|---|---|---|
动画 (Animations) 测量渲染动画的时间。 | MainLoopAnimation | 主循环:动画 | m_animationProfiler |
应用程序事件处理 测量收集和处理所有可用事件源的事件所花费的事件,如键盘、鼠标和其他可用操纵器。 | MainLoopApplicationEvents | 主循环:应用程序事件 | m_applicationEventsProfiler |
应用程序逻辑更新 测量花费在您提供的 Application::update 重写上的时间。 | MainLoopAppUpdate | 主循环:应用程序更新 | m_appUpdateProfiler |
用户提供的应用程序逻辑更新 测量花费在执行您提供的更新逻辑回调 Application::onUpdate 上的时间。 | MainLoopUserUpdate | 主循环:用户更新 | m_userUpdateProfiler |
图形事件处理 测量处理影响图形输出的事件花费的时间,如重设窗口大小。 | MainLoopGraphicsEvents | 主循环:图形事件 | m_graphicsEventsProfiler |
性能 HUD (Performance HUD) 测量渲染 性能 HUD (Performance HUD) 中的信息导致的开销。 | MainLoopHUD | 主循环:HUD | m_hudProfiler |
输入事件处理 测量 InputManager 处理输入事件花费的时间,如键盘和鼠标事件。 | MainLoopInput | 主循环:输入 | m_inputProfiler |
布局 测量布局通道的性能。 | MainLoopLayout | 主循环:布局 | m_layoutProfiler |
渲染 (Rendering) 测量在 Application::renderOverride 中渲染屏幕所花费的时间。 | MainLoopRendering | 主循环:渲染 | m_renderingProfiler |
资源部署 测量处理异步任务部署队列花费的时间。 | MainLoopResourceDeployment | 主循环:资源部署 | m_resourceDeploymentProfiler |
资源管理器更新 测量 ResourceManager 处理负载和部署队列花费的时间。 | MainLoopResourceManagerUpdate | 主循环:资源管理器更新 | m_resourceManagerUpdateProfiler |
任务调度程序 测量执行添加到任务调度器中的任务花费的时间。 | MainLoopTaskDispatcher | 主循环:任务调度程序 | m_taskDispatcherProfiler |
任务调度器 测量执行添加到任务调度器中的定期任务花费的时间,如动画。 | MainLoopTaskScheduler | 主循环:任务调度器 | m_taskSchedulerProfiler |
在 性能 HUD (Performance HUD) 中,您可以显示所有主循环任务性能剖析程序的性能测量图表。请参阅在 性能 HUD (Performance HUD) 中显示性能测量图。
在应用程序配置中,您可以设置主循环性能剖析程序中采样缓冲区的大小。请参阅 主循环剖析样本缓冲区计数。
对于在主循环任务剖析程序注册表 MainLoopTaskProfilerRegistry
中注册的性能剖析类别的性能剖析程序,您可以显示其性能剖析图。要访问主循环任务剖析程序注册表,使用 Domain::getMainLoopTaskProfilerRegistry
。
本节介绍了如何显示 Profiling build 中包含的主循环任务剖析程序的性能测量图。请参阅主循环任务性能剖析类别。
您还可以显示创建用于测量应用程序代码性能的主循环任务剖析程序的性能测量图。请参阅测量自定义主循环任务的性能。
要在 性能 HUD (Performance HUD) 中显示性能测量图:
PerformanceInfoLevel = 2
onConfigure()
函数中:configuration.performanceInfoLevel = ApplicationProperties::PerformanceInfoLevelFull;)
ProfilingCategoryFilter="MainLoopAnimation|MainLoopRendering|MainLoopHUD=show"
onConfigure()
函数中:configuration.profilingCategoryFilter = "MainLoopAnimation|MainLoopRendering|MainLoopHUD=show";
performance_info.hpp
头文件。#include <kanzi/core.ui/application/performance_info.hpp>
onProjectLoaded
函数中添加://获取 performanceInfo 对象。如果对象不存在,请创建。 PerformanceInfo& performanceInfo = acquirePerformanceInfo(); //将图形框的颜色设置为灰色。 performanceInfo.setBorderColor(ColorRGBA(0.5f, 0.5f, 0.5f)); //将图形数据的颜色设置为黄色。 performanceInfo.setLineColor(ColorRGBA(1.0f, 1.0f, 0.0f)); //将文本的颜色设置为黑色。 performanceInfo.setFontColor(ColorRGBA(0.0f, 0.0f, 0.0f));
当您运行应用程序时,性能 HUD (Performance HUD) 显示性能测量图。
如果您看不到这些图,放大应用程序窗口。
要分析 Kanzi Engine 性能,记录性能剖析数据。
您可以使用 Profiling build 中的 Kanzi 启动性能剖析程序测量应用程序启动期间 Kanzi Engine 花费在不同任务的时间。请参阅启动性能剖析类别。
要记录启动性能信息,使用 Profiling build 配置构建您的应用程序。
例如,要在 Windows 上构建并运行您的应用程序:
<MyProject>\Application\bin> ..\output\Win32\GL_vs2015_Profiling\MyApplication.exe > MyApplicationProfiling.log
Kanzi 将启动性能测量信息写入日志中。
... info:profiling> StartupInitialization 332 018 600 ns info:profiling> |-- StartupInitializeGraphics 301 798 600 ns info:profiling> |-- StartupCreateDomain 1 325 300 ns info:profiling> |-- StartupInitializeLoadingThreads 27 126 000 ns info:profiling> |-- StartupRegisterRuntimeAssets 132 400 ns info:profiling> |-- StartupLoadPlugins 200 ns info:profiling> |-- StartupRegisterMetadata 449 000 ns info:profiling> |-- StartupOpenKzb 398 000 ns info:profiling> StartupInitializeGL 100 ns info:profiling> StartupResumeGL 536 400 ns info:profiling> StartupLoadPrefab 388 009 100 ns info:profiling> StartupInstantiatePrefab 10 308 400 ns info:profiling> StartupRegisterDefaultResources 25 800 ns info:profiling> StartupAttachPrefab 8 058 300 ns info:profiling> StartupResetRenderer 74 200 ns info:profiling> StartupOnProjectLoaded 21 400 ns info:profiling> Startup profiling data logging took 1 920 000 ns ...
您可以记录来自特定剖析程序的数据:
logAllData
函数。m_renderingProfiler
的所有数据:getDomain()->getMainLoopTaskProfilerRegistry().m_renderingProfiler->logAllData();
要记录来自剖析程序的数据摘要,使用 logAggregateData
函数。
例如,要记录来自主循环动画剖析程序 m_animationProfiler
的数据摘要:
getDomain()->getMainLoopTaskProfilerRegistry().m_animationProfiler->logAggregateData();
您可以通过在剖析程序中迭代并调用 logAggregateData()
或 logAllData()
函数来记录特定剖析程序注册表中注册的所有剖析程序的数据。
例如,要在退出应用程序时记录来自所有主循环任务剖析程序的性能剖析数据摘要:
//Kanzi 在应用程序退出时调用函数。
virtual void onShutdown() KZ_OVERRIDE
{
//获得主循环任务剖析程序注册表 MainLoopTaskProfilerRegistry
。
const MainLoopTaskProfilerRegistry& mainRegistry = getDomain()->getMainLoopTaskProfilerRegistry();
//通过主循环任务剖析程序注册表中的所有剖析程序,并记录其总数据。
for (MainLoopTaskProfilerRegistry::ProfilerContainer::const_iterator
profilerIter = mainRegistry.beginProfilers(),
profilerIterEnd = mainRegistry.endProfilers();
profilerIter != profilerIterEnd; ++profilerIter)
{
(*profilerIter)->logAggregateData();
}
}